---
title: 从对象存储中读取JSON数据
---

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

PXF 对象存储连接器支持读取JSON格式数据。 本节描述如何使用PXF访问对象存储中的JSON数据，包括如何创建和查询引用对象存储中JSON文件的外部表。

**注意**: 从对象存储访问JSON数据和访问HDFS中的JSON数据非常相似。 本主题标识了读取对象存储中JSON数据所需的特定信息，并在通用信息的位置链接到 [PXF HDFS JSON 文档](hdfs_json.html) 。

## <a id="prereq"></a>先决条件

在您尝试从对象存储中读取数据前，确保已满足PXF 对象存储[先决条件](access_objstore.html#objstore_prereq) 。

## <a id="avro_work"></a>使用JSON数据

有关基于JSON文本的数据交换格式的说明，请参阅PXF HDFS JSON文档中的 [使用JSON数据](hdfs_json.html#hdfsjson_work)。

## <a id="json_cet"></a>创建外部表

使用 `<objstore>:json` 配置文件读取对象存储中的JSON格式文件。 PXF 支持以下 `<objstore>` 配置前缀:

| 对象存储  | 配置前缀 |
|-------|-------------------------------------|
| Azure Blob Storage   | wasbs |
| Azure Data Lake    | adl |
| Google Cloud Storage    | gs |
| Minio    | s3 |
| S3    | s3 |

以下语法创建一个引用JSON格式文件的Greenplum数据库可读外部表：

``` sql
CREATE EXTERNAL TABLE <table_name>
    ( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<path-to-file>?PROFILE=<objstore>:json&SERVER=<server_name>[&<custom-option>=<value>[...]]')
FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
```

[CREATE EXTERNAL TABLE](../ref_guide/sql_commands/CREATE_EXTERNAL_TABLE.html)命令中使用的特定关键字和值见下表中描述。

| 关键字  | 值 |
|-------|-------------------------------------|
| \<path&#8209;to&#8209;file\>    | 对象存储中文件或目录的绝对路径 |
| PROFILE=\<objstore\>:json    | `PROFILE` 必须指定为特定的对象存储。 例如： `s3:json` 。 |
| SERVER=\<server_name\>    | PXF 访问数据时使用的服务配置 |
| \<custom&#8209;option\>=\<value\> | JSON 支持的名为 `IDENTIFIER` 的自定义选项描述见 [PXF HDFS JSON 文档](hdfs_json.html#customopts) 。 |
| FORMAT 'CUSTOM' | 在`<objstore>:json` 配置文件中使用 `FORMAT` `'CUSTOM'` 。 `CUSTOM` `FORMAT` 要求您指定为 `(FORMATTER='pxfwritable_import')`。 |

如果要访问S3 对象存储，则可以如 [覆盖S3服务配置](access_objstore.html#s3_override) 中所述直接在 `CREATE EXTERNAL TABLE` 命令中提供S3凭据。

## <a id="example"></a>示例

有关JSON示例，请参阅PXF HDFS JSON 文档中的 [将样本JSON数据加载到HDFS](hdfs_json.html#jsontohdfs) 以及 [示例：读取单行记录的JSON文件](hdfs_json.html#jsonexample1) 。 在对象存储中运行示例，必要的修改如下：

- 将文件复制到对象存储而不是HDFS。 例如，将文件复制到S3：

    ``` shell
    $ aws s3 cp /tmp/singleline.json s3://BUCKET/pxf_examples/
    $ aws s3 cp /tmp/multiline.json s3://BUCKET/pxf_examples/
    ```

- 使用上述的 `CREATE EXTERNAL TABLE` 语法和 `LOCATION` 关键字及设置。例如， 假设您的服务名为 `s3srvcfg` ：

    ``` sql
    CREATE EXTERNAL TABLE singleline_json_s3(
      created_at TEXT,
      id_str TEXT,
      "user.id" INTEGER,
      "user.location" TEXT,
      "coordinates.values[0]" INTEGER,
      "coordinates.values[1]" INTEGER
    )
      LOCATION('pxf://BUCKET/pxf_examples/singleline.json?PROFILE=s3:json&SERVER=s3srvcfg')
    FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
    ```

